Spring Boot 初始化及加载

Spring Boot 初始化及加载

1. 设置开关

bannerMode (横幅模式,默认为CONSOLE)

logStartupInfo (日志开关,默认为true)

addCommandLineProperties (添加命令行属性开关,默认为true)

headless (程序运行模式,java.jwt.headless=true)

registerShutdownHook (注册销毁回调,默认为true)

2.初始化profile容器

存储当前激活的profile

3.初始化

3.1 推断运行环境

首先判定classpath下是否包含javax.servlet.Servlet类或org.springframework.web.context.ConfigurableWebApplicationContext类,若包含二者其中一个,则推断当前程序为web程序

3.2 初始化初始工厂类

加载在classpath:META-INF/spring.factories文件中属性keyorg.springframework.context.ApplicationContextInitializer的值——工厂类的全限定名

3.3 初始化容器监听

加载在classpath:META-INF/spring.factories文件中属性keyorg.springframework.context.ApplicationListener的值——容器监听的全限定名

3.4 推断程序入口主类

根据栈帧推断程序入口类

4.加载

4.1 注册StopWatch并打开
4.2 初始化环境配置容器
4.3 初始化失败分析器
4.4 响应程序运行模式(前面提到的 java.awt.headless,这里不扩展此点,自行查阅资料)
4.5 加载spring boot监听

加载在classpath:META-INF/spring.factories文件中属性keyorg.springframework.boot.SpringApplicationRunListener的值——spring boot监听的全限定名

4.6 加载应用参数

根据程序入口main(String[] args)中的参数配置对应的应用参数,等到应用参数对象。

4.7 根据应用参数及spring boot监听配置环境并提供环境配置对象

获取或创建环境容器

加载配置文件并根据spring.profiles.active加载profile

加载配置文件并触发环境前监听

4.8 打印横幅
4.9 创建ApplicationContext
4.10 创建失败分析器

加载在classpath:META-INF/spring.factories文件中属性keyorg.springframework.boot.diagnostics.FailureAnalyzer的值——失败分析器的全限定名,

并且注入BeanFactory

注意,此失败分析器与4.3提到的并不是一个失败分析器,当前创建失败分析器为配置spring.factories中的失败分析器。

4.11 前置配置ApplicationContext

注入前面构建好的环境对象到ApplicationContext

根据BeanNamedGeneratorResourceLoader后置处理ApplicationContext

应用所有初始化器

响应应用上下文前置监听

初始化日志对象

把应用参数对象加入到容器中

加载所有资源到ApplicationContext

响应应用加载时监听

4.12 刷新ApplicationContext

刷新BeanFactory

自定义后置处理Bean工厂,若未继承SpringApplication并且未实现该方法,未此步骤忽略

调用Bean工厂后置处理器

注册Bean后置处理器

初始化国际化

初始化应用事件

自定义刷新,若未继承SpringApplication并且未实现该方法,未此步骤忽略

注册所有监听到容器

结束BeanFactory初始化

结束IOC容器初始化

注册销毁回调

4.13 刷新后处理

回调所有Runner

4.14 响应所有上下文初始化完成时监听
4.15 关闭StopWatch
4.16 日志输出